package entretenimiento.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import entretenimiento.excepcion.DAOExcepcion;
import entretenimiento.modelo.Solicitud_dia_Campo;
import entretenimiento.util.ConexionBD;

public class Solicitud_dia_campoDAO extends BaseDAO {
	
	public Solicitud_dia_Campo obtener(int CodigoDiaCampo) throws DAOExcepcion {
		//Collection<Solicitud_dia_Campo> lis = new ArrayList<Solicitud_dia_Campo>();
		Solicitud_dia_Campo entSolicitud = new Solicitud_dia_Campo();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try{
			con = ConexionBD.obtenerConexion();
			String query = "select CoDiaCampo,CoResponsable,FeDiaCampo,NuTotalPersonas, " +
					"s.CoClub,NoClub,SsImporteTotal from solicitud_dia_campo " +
					"s inner join club c on s.CoClub = c.CoClub " +
					"where CoDiaCampo = ?";
			stmt = con.prepareStatement(query);
			
			stmt.setInt(1, CodigoDiaCampo);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				entSolicitud.setCoDiaCampo(rs.getInt("CoDiaCampo"));
				entSolicitud.setCoResponsable(rs.getInt("CoResponsable"));
				entSolicitud.setFeDiaCampo(rs.getString("FeDiaCampo"));
				entSolicitud.setNuTotalPersonas(rs.getInt("NuTotalPersonas"));
				entSolicitud.setSsImporteTotal(rs.getDouble("SsImporteTotal"));
				entSolicitud.setCoClub(rs.getInt("CoClub"));
				entSolicitud.setNoClub(rs.getString("NoClub"));
				//entSolicitud.setCoOferta(rs.getInt("CoOferta"));
				//lis.add(entSolicitud);
			}
						
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);	
		}
		return entSolicitud;		
	}
	
	public Collection<Solicitud_dia_Campo> listar() throws DAOExcepcion {
		Collection<Solicitud_dia_Campo> lis = new ArrayList<Solicitud_dia_Campo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try{
			con = ConexionBD.obtenerConexion();
			String query = "select CoDiaCampo,CoResponsable,FeDiaCampo,NuTotalPersonas,SsImporteTotal, " +
					"CoClub,CoOferta from solicitud_dia_campo " +
					"where FlAprobado = 0 order by FeDiaCampo";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Solicitud_dia_Campo entSolicitud = new Solicitud_dia_Campo();
				entSolicitud.setCoDiaCampo(rs.getInt("CoDiaCampo"));
				entSolicitud.setCoResponsable(rs.getInt("CoResponsable"));
				entSolicitud.setFeDiaCampo(rs.getString("FeDiaCampo"));
				entSolicitud.setNuTotalPersonas(rs.getInt("NuTotalPersonas"));
				entSolicitud.setSsImporteTotal(rs.getDouble("SsImporteTotal"));
				entSolicitud.setCoClub(rs.getInt("CoClub"));
				entSolicitud.setCoOferta(rs.getInt("CoOferta"));
				lis.add(entSolicitud);
			}
						
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);	
		}
		return lis;		
	}
	
	public Solicitud_dia_Campo actualizar(Solicitud_dia_Campo entSolicitud) throws DAOExcepcion{
		
		String query = "update solicitud_dia_campo set FeDiaCampo=?,NuTotalPersonas=?,SsImporteTotal=? " +
				"where CoDiaCampo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, entSolicitud.getFeDiaCampo());
			stmt.setInt(2, entSolicitud.getNuTotalPersonas());
			stmt.setDouble(3, entSolicitud.getSsImporteTotal());			
			stmt.setInt(4, entSolicitud.getCoDiaCampo());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return entSolicitud;		
	}
	
	public void aprobar(int coDiaCampo,int CoUsuarioAdmin) throws DAOExcepcion{		
		String query = "update solicitud_dia_campo set FlAprobado = 1,FeAprobado= sysdate(),CoUsuarioAdmin=? where CoDiaCampo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, CoUsuarioAdmin);
			stmt.setInt(2, coDiaCampo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo aprobar la solicitud");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}		
	}
	
	public int insertar (Solicitud_dia_Campo so )  throws DAOExcepcion {
		String query = "insert into solicitud_dia_campo(CoResponsable,FeDiaCampo,NuTotalPersonas,SsImporteTotal,CoClub,CoOferta) " +
				"values (?,?,?,?,?,?)";
		int id = 0;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, so.getCoResponsable());
			stmt.setString(2, so.getFeDiaCampo());
			stmt.setInt(3, so.getNuTotalPersonas());
			stmt.setDouble(4, so.getSsImporteTotal());
			stmt.setInt(5, so.getCoClub());
			stmt.setInt(6, so.getCoOferta());
					
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
		
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}			
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}	
		return id;
	}
	
	public Collection<Solicitud_dia_Campo> ListarSolicitud() throws DAOExcepcion {
		Collection<Solicitud_dia_Campo> listado = new ArrayList<Solicitud_dia_Campo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try{
			con = ConexionBD.obtenerConexion();
			String query = "select CoDiaCampo, CONCAT(NoApePaterno,' ', NoApeMaterno, ' ', NoNombres) NOMBRE, " +
						   "FeDiaCampo, NuTotalPersonas, SsImporteTotal, NoClub from responsable_familia r " +
						   "inner join solicitud_dia_campo s " +
						   "on r.CoResponsable = s.CoResponsable " +
						   "inner join club c " +
						   "on s.CoClub = c.CoClub " +
						   "where flAprobado is null " +
						   "or flAprobado = 0 order by CoDiaCampo asc ";

			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Solicitud_dia_Campo entSolicitud = new Solicitud_dia_Campo();
				entSolicitud.setCoDiaCampo(rs.getInt(1));
				entSolicitud.setNombreCompleto(rs.getString(2));
				entSolicitud.setFeDiaCampo(rs.getString(3));
				entSolicitud.setNuTotalPersonas(rs.getInt(4));
				entSolicitud.setSsImporteTotal(rs.getDouble(5));
				entSolicitud.setNombreClub(rs.getString(6));
				listado.add(entSolicitud);
			}
						
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);	
		}
		return listado;		
	}
	
	public Solicitud_dia_Campo aprobar_solicitud(Solicitud_dia_Campo vo) throws DAOExcepcion{
		
		String query = "UPDATE solicitud_dia_campo SET FlAprobado=?, FeAprobado=?, CoUsuarioAdmin=? " +
					   "WHERE CoDiaCampo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getFlAprobado());
			stmt.setString(2, vo.getFeAprobado());
			stmt.setInt(3, vo.getCoUsuarioAdmin());
			stmt.setInt(4, vo.getCoDiaCampo());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;		
	}
	
}
